Integração Contínua (Continuous Integration)

Instituto Metrópole Digital (IMD/UFRN)
PPgSW - Metodologias de Desenvolvimento de Softwares
Tópicos Avançados de Engenharia De Software III
Eduardo Luiz Gomes - Natal, Dezembro 2018

!

Quem sou eu?

Eduardo Luiz, Bacharel em Administração pela Universidade Estadual do Rio Grande do Norte (UERN). Mestrando em Engenharia de Software pelo Instituto Metrópole Digital (IMD/UFRN). Trabalha como coordenador do setor de desenvolvimento de softwares da empresa Avance - Inteligência em Gestão, criando sistemas de integração e business intelligence.

GitHub: @bal699 / Linkedin: @eduardo-bal699 / Twitter: @bal699 / eduardo.luizgs@hotmail.com

!

Problemática:

Você criou e testou um código maravilhoso no seu ambiente de desenvolvimento, e agora você quer disponibilizar isso para o mundo.

!

Qual o caminho você segue?

question2.png

Fácil!

Basta executar python app.py runserver em algum computador que esteja ligado a internet e acessível na porta 80 e a mágica acontece. Certo?!

!

Você está certo disso?

silvio.png

Alguns cenários:

  • Sua aplicação é capaz de suportar o acesso simultâneo de 1.000.000.000 de usuários?
  • Ou melhor, é capaz de suportar pelo menos 2 usuários?
  • Como você controla quem está realizando as requisições?
  • Como você garante que as transações ocorrem de forma isoladas e consistentes?
  • Como você garante que a sua aplicação usa o mínimo de recursos de acesso ao banco de dados?
  • Se sua aplicação crescer, como você gerencia a distribuição do seu aplicativo em diferentes servidores?
  • Como você garante que os recursos de hardware e rede estão sendo priorizados para a sua aplicação?
  • Como você garante que as alterações no código ou novos recursos programados estão de fato funcionando corretamente e prontos para entrarem em produção?
  • Sua aplicação é capaz de se adaptar rápidamente aos objetivos de negócio e exisgências dos usuários?

É agora complicou um pouco!

!

Na Prática:

dev_vs_production.png

Na prática, sempre existe conflito de interesse

!

Dev vs Ops

devops-fire.jpg

O que é um DevOp?

O termo DevOps deriva da junção das palavras "desenvolvimento" (development) e "operações" (operations), sendo uma prática de engenharia de software que possui o intuito de unificar o desenvolvimento de software (Dev) e a operação de software (Ops).

devops.jpg

DevOps: Antes vs Depois

devops-before-after.png

Qual o Papel do DevOps?

Garantir o fornecimento de software com base em integração contínua, agilidade, qualidade, estabilidade com escalabilidade e elasticidade. As práticas de DevOps integram as áreas de desenvolvimento e operações dando suporte a cultura de Integração Contínua.

!

O que é integração contínua (CI)?

É uma prática/filosofia/cultura que colabora para que o trabalho de desenvolvimento de software seja baseado em entregas menores, porém mais frequentes, tornando o processo mais flexível, ágil e eficiente.

Nesse processo os desenvovedores juntam as pequenas alterações de código em um repositório principal compartilhado várias vezes ao dia e de forma contínua. Processos automatizados testes, validam e colocam essas alterações em produção de forma transparente tanto para os desenvolvedores quanto para os usuários.

!

cd.jpg

Integração Contínua: Objetivos

De forma geral o objetivo da IC é estabelecer uma maneira consistente e automatizada de criar, empacotar e testar aplicativos.

Alguns objetivos específicos da IC:

  • *Melhora a produtividade do desenvolvedor:* Ajuda sua equipe a ser mais produtiva ao liberar os desenvolvedores de tarefas manuais.
  • *Encontre e investigue bugs mais rapidamente:* Com testes mais frequentes, sua equipe pode descobrir e investigar bugs mais cedo, antes que no futuro os problemas cresçam demais.
  • *Distribua atualizações mais rapidamente:* Ajuda a sua equipe a distribuir atualizações para os clientes mais rapidamente e com maior frequência.

Por que ela é necessária atualmente?

No passado, os desenvolvedores de uma equipe podiam trabalhar isoladamente por um longo período e só juntar suas alterações à ramificação mestre quando concluíssem seu trabalho.

Dessa forma, a junção das alterações de códigos era difícil e demorada, além de resultar no acúmulo de erros sem correção por longos períodos. Estes fatores dificultavam uma distribuição de atualizações rápidas para os clientes.

slow.jpg

Divisão da Integração Contínua

Os conceitos de IC representam métodos para acelerar a entrega de novas versões de uma aplicação, e estão alinhados com as metodologias de desenvolvimento ágil.

!

Como funciona a integração continua? (1)

  • Com a integração continuada, os desenvolvedores frequentemente confirmam um repositório compartilhado usando um sistema de controle de versão, como o Git.
  • Antes de cada confirmação, os desenvolvedores podem escolher executar testes de unidade locais em seus códigos como uma camada de verificação extra anterior à integração.
  • Um serviço de integração contínua cria e executa automaticamente testes de unidade nas novas alterações de código para destacar imediatamente todos os erros.
  • A integração contínua é referente aos estágios de criação e teste de unidade do processo de lançamento de software.

ci-cycle.png

Como funciona a integração continua? (2)

  • Cada revisão confirmada aciona criação e teste automatizados.
  • Com a distribuição contínua, as alterações de código são criadas, testadas e preparadas automaticamente para que a produção seja liberada.
  • A distribuição contínua expande com base na integração contínua ao implantar todas as alterações de código em um ambiente de teste e/ou ambiente de produção, após o estágio de criação.

ci-cycle.png

Integração contínua (Continuous Integration)

Prática de desenvolvimento de software que visa tornar a integração de código mais eficiente, através de builds e testes automatizados.

!

Entrega Contínua (Continuous Delivery)

A Entrega Contínua é uma extensão da Integração Contínua. Além das práticas da Integração Contínua, a Entrega Contínua visa garantir que o código esteja apto/pronto para entrar em ambiente de produção.

  • O deploy do código nos ambientes de homologação e desenvolvimento deve ser realizado de forma automatizada e simplificada
  • Os testes complementares aos unitários e inspeções finais devem ser executadas o mais rápido possível

!

Implantação Contínua (Continuous Deployment)

É uma extenssão da IC/EC. Mesmo com todos os cuidados tomados durante o processo de CI, cada ambiente está sujeito a suas particularidades e problemas podem surgir.

!

Implantação Contínua (Continuous Deployment)

É necessário que a equipe de operações esteja atenta e saiba como proceder rapidamente para garantir a estabilidade do ambiente de produção.

monitoring.png

Ferramentas para Integração Contínua

  • Heroku: é uma plataforma em nuvem baseada em sistemas de containers gerenciados, chamados de Dynos, possuidores de um ambiente de software plugável e configurável, preparados para rodar e depurar sistemas web.

heroku.png

DEMO: Mãos a obras! Let's Go Coding!!!

golum.jpeg

Agenda

  • Criar um pequeno projeto em Node.js
  • Configurar a integração no Heroku
  • Realizar alterações no projeto e verificar como elas se integram no processo de CI
  • Monitorar os serviços em eecução

Requisitos

Criando um repositório para o projeto no GitHub (1)

Para demonstrar o processo de integração vamos necessitar de novo repositório no GitHub:

  • Clique no botão New e crie um novo repositório público no GitHub. Guarde o seu nome, pois vamos precisar dele mais tarde

github1.png

Criando um repositório para o projeto no GitHub (2)

  • Informe os dados do novo repositório e clique em Create Repository

!

Criando um repositório para o projeto no GitHub (3)

  • Com o novo repositório criado clique em Clone or download e copie a URL do repositório

github4.png

Criando um novo reposótiro a partir de um fork

  • Você também pode realizar um fork do meu repositório em https://goo.gl/nzp2h3
  • Basta localizar o repositório e clicar no botão Fork

github-forkk.png

Clonando o projeto do GitHub

  • Abra um CMD, escolha uma pasta para armazenar o projeto e realize o clone do repositório
$ git clone https://github.com/<seu-usuario>/hands-on-node-microservices-ci.git

clone-git.png

Abrindo o projeto

  • Abre o projeto no seu editor de texto favorito

visual-studio-1.png

Criando Projeto Base

Para exemplificar o processo de integração contínua, vamos utilizar uma aplicação simples em Node.js:

  • Localize a pasta root do projeto
  • Em seguida crie um arquivo chamado server.js
  • Em seguida crie um arquivo chamado server.test.js
  • Em seguida crie um arquivo chamado package.json

Arquivo: server.js

'use strict';

require('dotenv').config()
const Hapi = require('hapi');

// Create a server with a host and port
const server = Hapi.server({
    host:'0.0.0.0',
    port: process.env.PORT || 8009
});

// Add the route
server.route({
    method:'GET',
    path:'/',
    handler:function(request,h) {
        return 'Hellow World';
    }
});

// Start the server
async function start() {
    try {
        await server.start();
    }
    catch (err) {
        console.log(err);
        process.exit(1);
    }
    console.log('Server running at:', server.info.uri);
};

// Start Now!
start()`

Arquivo: server.test.js

// test the applicatio is running, it's mocking for now
test("Verificando página principal está acessível", () => {
    expect(true).toBe(true)
})

Arquivo: package.json

{
  "name": "avangers",
  "version": "1.0.0",
  "description": "Avangers",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "test": "jest"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "dotenv": "^6.2.0",
    "hapi": "^17.8.1",
    "jest": "^23.6.0"
  }
}

Pré-Build

Antes de iniciar o processo de Build precisamos gerar o arquivo package.json.lock. Para instalar os módulos do Node digite o comando:

$ npm install

Isso irá criar o arquivo package.json.lock e pasta node_modules com os arquivos auxiliares necssários.

Pré-Teste

  • Vamos verificar se o aplicativo está funcionando corretamente antes do build
$ npm run test
  • Verifique se todos os testes passarão e inicie a aplicação
$ npm start

Teste

Após acesse via navegador para testar a aplicação: http://localhost:8009

build-teste-hellow.png

Adicionar um novo projeto no Heroku (1)

  • Clique em Create New App

heroku-1.png

Adicionar um novo projeto no Heroku (2)

  • Adicione um nome para o seu aplicativo e clique em Create App

!

Adicionar um novo projeto no Heroku (3)

  • Página principal de aplicativos

heroku-3.png

Conectando o Heroku ao GitHub (1)

A Heroku permite que você adicione repositórios do GitHub diretamente a plataforma para realizar o processo de CI.

  • Selecione o projeto na página principal
  • Na página Overview do projeto clique em More > Add Pipeline ou clique na aba Deploy

heroku-4.png

Conectando o Heroku ao GitHub (2)

  • Em Deploy Method selecione o ícone do GitHub
  • Depois clique no botão Conect to GitHub

heroku6.png

Conectando o Heroku ao GitHub (3)

  • Confirme a solicitação do conexão na janela popup informando sua senha de acesso ao GitHub

!

Conectando o Heroku ao GitHub (4)

  • Na seção Connect to GitHub > Search for a repository to connect to informe o nome do projeto criado no ínicio do tutorial
  • Clique no botão Search
  • Depois no botão Connect

heroku9.png

Conectando o Heroku ao GitHub (5)

  • Sua configuração deve paracer com a imagem abaixo

heroku10.png

Habilitando Deploy automatico

Cada envio/push para o ramo/branch que você especificar irá implantar uma nova versão do aplicativo automaticamente.

  • Selecione o branch que irá responder para o processo automatico de deploy
  • Habilite a opção Wait for CI to pass before deploy
  • Clique em Enable Automatic Deploy

heroku11.png

Criando um Pipeline (1)

Pipeline são como fluxos de trabalhos a serem executados quando um evento ocorre nos repositório.

  • Na seção Add this app to a pipeline clique em Create a new pipeline

heroku12.png

Criando um Pipeline (2)

  • Informe um nome para o pipeline e clique em Create pipiline

heroku14.png

Conectando o Pipeline ao GitHub (1)

Após é necessário conectar o Heroku CI a sua conta do GitHub. Assim teremos acesso as funcionalidades de integração contínua da plataforma quando uma alteração ocorrer no repositório.

  • Clique no botão Connect to GitHub

heroku15.png

Conectando o Pipeline ao GitHub (2)

  • Na seção Pipeline connected to GitHub informe o nome do repositório
  • Clique no botão Search
  • Clique no botão Connect

heroku16.png

Habilitando o Heroku CI

O Heroku CI é um recurso PAGO da plataforma. Dessa forma é necessário cadastrar um cartão de crédito para ter acesso ao recurso. A plataorma oferece algumas horas de testes gratuitos antes da cobrança.

heroku17.png

Subindo a aplicação (1)

Um vez que temos a aplicação configurada corretamente, podemos agora realizar o commit e push do repositório para vermos a mágica acontecer.

  • Adicione as alterações ao repositório local
$ git add .
  • Commit as alterações no repositório
$ git commit -m "Commit inicial"
  • Envie as alterações para o servidor
$ git push

Subindo a aplicação (2)

Automaticamenteo Heroku irá identificar a alteração no branch e iniciar o processo de deploy. Caso exista algum erro no processo, este será mostrado no console do pipeline

heroku20.png

Subindo a aplicação (3)

Durante o processo de build a plataforma irá procurar pelo arquivo package.json, pois é a partir dele que as dependências serão instaladas e os testes serão executados. Você pode acompanhar o processo de build e tests ao vivo pela página do Pipeline > Tests

heroku22.png

Subindo a aplicação (4)

Se tudo estiver OK você verá o status de sucesso conforme abaixo

heroku23.png

Testando a Aplicação

  • Va até aba Pipeline clique no DropDown ao lado do brach com status de OK e selecione Open App in Browser

heroku24.png

Eeeeee..... Voilá!!!!

heroku29.png

Mas será que funcionou mesmo?!

Vamos realiar um testes simples. Vamos alterar o código da nossa aplicação, realizar o commit e push e verificar se a plataforma de CI consegue subir essas alterações corretamente.

  • Altera o arquivo server.js, modificando a mensagem de Hellow World
// Add the route
server.route({
    method:'GET',
    path:'/',
    handler:function(request,h) {
        return 'Hellow World! Finalmente consegui terminar esse tutorial!';
    }
});
  • Faça o commit do repositório
  • Faça o push das alterações
  • Verifique o painel do Heroku CI
  • Atualize a aplicação no seu navegador

Mas será que funcionou mesmo?! (2)

  • Verifique o painel do Heroku CI
  • Atualize a aplicação no seu navegador

heroku30.png

Calma, ainda não acabou...

  • No ínicio criamos um pipeline de Staging, que seria algo com um ambiente de "Encenação/Homologação".

  • Seguindo as boas práticas do CI, antes de colocar um recurso em produção é muito interessante realizar outros tipos de testes, como os testes de aceitação ou de usuabilidade.

  • Somente após essa aprovação é que a nova versão do aplicativo deve entrar em produção.

Criando ambiente de produção (1)

Assim vamos criar um novo pipeline de produção para disponibilizar nossa aplicação após os testes.

  • Na página do Pipeline no painel Production clique em + Add App
  • Informe um nome para o aplicativo de produção ex: hands-on-microservices-production
  • Clique no botão Create new App...

heroku31.png

Promovendo o aplicativo de testes para produção

Ao criar um aplicativo de produção automaticamente irá surgir o botão Promote to productuin no painel Staging.

  • Clique nele para enviar o aplicativo para produção.
  • Em seguida clique no botão Promote

!

Eeee.... Voilá!!!

Aplicativo em produção. Esse proceso também poderia ser automatizado a partir de algumas regras, porém, para fins de demonstração, usamos o processo manual.

heroku35.png

Resumindo: O que vimos?

  • Criamos um projeto básico em Node.js
  • Configurar um aplicativo no Heroku
  • Configuramos um ambiente de testes/homologação para testar as alterações
  • Integramos o aplicativo a um repositório no GitHub
  • Configuramos o processo de testes automaticos
  • Configuramos o processo de build automatico
  • Configuramos um ambiente de produção para enviar as alterações aprovadas

ci-cycle.png

É isso! Dúvidas?! Perguntas?! Questionamentos!?

question.jpg